<?php

/**
 * presupuesto actions.
 *
 * @package    Acatec
 * @subpackage presupuesto
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class presupuestoActions extends sfActions
{
  public function executeIndex(sfWebRequest $request)
  {
  	
  	$this->getUser()->setAttribute('current','presupuesto');
  	
  	 // Creamos una vble de usuario que contendrá el id de la empresa
        // Tomamos el nombre de usuario, para obtener a través de la consulta cruzada el id de la empresa
        $user = $this->getContext()->getUser()->getGuardUser();
        $username = $user->getUsername();
    
        //Creamos la consulta para obtener el idempresa a partir del nombre de usuario
        $q = Doctrine_Query::create()
            ->select('empresa_id')
            ->from('CrmContacto c')
            ->where('c.id IN (SELECT u.contacto_id FROM CrmUserContacto u WHERE u.user_id IN 
                             (SELECT s.id FROM SfGuardUser s WHERE s.username= ?))',$username);

        $empresa_id = $q->fetchOne(array(), Doctrine_Core::HYDRATE_ARRAY);
    
        // Y el resultado lo guardamos en la vble de sesión.
        $this->getUser()->setAttribute('empresa_id', $empresa_id['empresa_id']);
  	
        // Definimos la cultura del usuario por defecto
  	//$this->getUser()->setCulture(sfConfig::get('app_culture_default','es'));
  	$this->getUser()->setCulture('es');
  	
  	
  	//$this->crm_presupuestos = Doctrine_Core::getTable('CrmPresupuesto')
    //  ->createQuery('a')
    //  ->execute();
    
  	if ($request->getParameter('sort') && $this->isValidSortColumn($request->getParameter('sort')))
  	{
  	      $this->setSort(array($request->getParameter('sort'), $request->getParameter('sort_type')));
  	}
  	
  	// pager
  	if ($request->getParameter('page'))
  	{
  	$this->setPage($request->getParameter('page'));
  	}
  	$this->pager = $this->getPager();
  	$this->sort = $this->getSort();
    
  }
  
  public function executeFilter(sfWebRequest $request)
  {
  	$this->setPage(1);
  
  	if ($request->hasParameter('_reset'))
  	{
  		$this->setFilters(array());
  
  		$this->redirect('@crm_presupuesto');
  	}
  
  	$this->filters = new CrmPresupuestoFormFilter($this->getFilters());
  
  	$this->filters->bind($request->getParameter($this->filters->getName()));
  	if ($this->filters->isValid())
  	{
  		$this->setFilters($this->filters->getValues());
  
  		$this->redirect('@crm_presupuesto');
  	}
  
  	$this->pager = $this->getPager();
  	$this->sort = $this->getSort();
  
  	$this->setTemplate('index');
  }
  
  public function executeShow(sfWebRequest $request)
  {
    $this->presupuesto = Doctrine_Core::getTable('CrmPresupuesto')->find(array($request->getParameter('id')));
    $this->presupuesto->calcular();
    $this->cliente = $this->presupuesto->getCrmContacto();
    $this->vehiculo = $this->presupuesto->getCrmVehiculo();
    $this->conceptos = $this->presupuesto->getCrmPresupuestoConcepto();
  
  }

  public function executeNew(sfWebRequest $request)
  {
  	/** NOTA DE MEJORA
  	*****************************************************************************************
  	En el modulo de inicio se inicializan las vbles de sesión.
  	Debería controlarse de algún modo que estas vbles hayan sido creadas al llegar a este punto
  	puesto que puede que el usuario no haya pasado por el punto inicial. **/
  	
        //Establezco esta vble de sesión que indica que vengo de un nuevo presupuesto para volver aquí
        $this->getUser()->setAttribute('nuevo_pto',1);  
        //Borro las vbles de sesion de los otros documentos
        $this->getUser()->getAttributeHolder()->remove('nuevo_parte');
        $this->getUser()->getAttributeHolder()->remove('nueva_fra');
        
        // Cargamos el valor del nuevo presupuesto (el número por el que debe comenzar si es el primero)
        if ($this->esPrimerPresupuesto()) {    
            $this->redirect('configuracion/primerPresupuesto');            
        }    
        else {
            $empresa_id = $this->getUser()->getAttribute('empresa_id');
            $this->form = new CrmPresupuestoForm();
  	    //Cogemos de la BD el numero que le corresponde
            $campo = "numPresupuesto";
            $q = Doctrine_Query::create()
            ->select('valor')
            ->from('CrmConfiguracion c1')
            ->where('c1.campo = ?',$campo);
            $this->numero = $q->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);
            //$this->numero = 3;
            $this->form->setDefault('numero', $this->numero);
            $this->form->setDefault('descuento', 0);
            $today = date("Y-m-d");
            $this->form->setDefault('fecha', $today);
            
            $campo = "tipoIVA";
            $q = Doctrine_Query::create()
            ->select('valor')
            ->from('CrmConfiguracion c2')
            ->where('c2.campo = ?',$campo);
            $tipo_iva = $q->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);
            $this->form->setDefault('tipo', $tipo_iva);
  	// Cambiamos el campo empresa_id
  	//$this->form->setWidget('empresa_id', new sfWidgetFormInputHidden(array('default' => $empresa_id)));
        
  	/*
  	 $this->form->setWidget('empresa_cli_id',  new sfWidgetFormDoctrineChoice(array(
  	'model' =>  'CrmEmpresaCli'    )));
  	$this->form->setWidget('presupuesto_categoria_id',  new sfWidgetFormDoctrineChoice(array(
  	'model' =>  'CrmPresupuestoCategoria'    )));
  	$tis->form->setWidget('publico', new sfWidgetFormInputCheckbox(array('value_attribute_value' => '1', 'default' => true)));
  	*/
        }
    
  }
  
  public function executeCreate(sfWebRequest $request)
  {
    $this->forward404Unless($request->isMethod(sfRequest::POST));
    $this->form = new CrmPresupuestoForm();
    $this->processForm($request, $this->form);
    $this->setTemplate('new');        
  }

  public function executeEdit(sfWebRequest $request)
  {
  	$this->getUser()->setAttribute('accion','editar');
        $this->getUser()->setAttribute('nuevo_pto',0);
        if ($this->getUser()->getAttribute('borrarBD')) {
            $this->borrarBD = $this->getUser()->getAttribute('borrarBD');
        }
        else{ // Para que funcione el Javascript
            $this->borrarBD = 0;
        }
        $this->forward404Unless($this->presupuesto = Doctrine_Core::getTable('CrmPresupuesto')->find(array($request->getParameter('id'))), sprintf('Object crm_presupuesto does not exist (%s).', $request->getParameter('id')));
        if (null == $this->presupuesto->getDescuento()){
            $this->presupuesto->setDescuento(0);
        }
        $this->cliente = $this->presupuesto->getCrmContacto();
        $this->vehiculo = $this->presupuesto->getCrmVehiculo();
        $this->presupuesto->calcular();
        $this->form = new CrmPresupuestoForm($this->presupuesto);
    
    // Cargamos el array de conceptos 
   	//$this->conceptos = $this->presupuesto->getCrmPresupuestoConcepto();
   	//$this->presupuesto->calculaTotal();
    
    //$this->concepto = new CrmPresupuestoConcepto();
    //$this->formConcepto = new CrmPresupuestoConceptoForm($this->concepto);
  }
  
  /*
   * Función creada para presupuestar un parte de trabajo
   * Automáticamente genera los datos del presupuesto y los edita
   * Si el usuario guarda el presupuesto el parte se marcará como presupuestado.
   * No se utiliza, puesto que con los formularios embebidos no podía crear los conceptos
   * si estos no estaban en la base de datos.
   * Queda a modo de histórico
   */
  public function executePresupuestarParteOld(sfWebRequest $request)
  {
     $this->parte = Doctrine_Core::getTable('CrmParte')->find(array($request->getParameter('id')));
     //Si el parte está presupuestado no puede volver a presupuestarse
     if ($this->parte->is_validated == TRUE) {
         $this->getUser()->setFlash('error', sfContext::getInstance()->getI18n()->__('ERROR: La orden nº '.$this->parte->getNumero().' ya está presupuestada'));
         $this->redirect('@crm_parte');
     } 
     else {
         //Si no está presupuestado...
         //Creo un nuevo objeto presupuesto
         $presupuesto = new CrmPresupuesto();
         //Establecemos el numero de presupuesto que le corresponde
         $campo = "numPresupuesto";
         $q = Doctrine_Query::create()
            ->select('valor')
            ->from('CrmConfiguracion c1')
            ->where('c1.campo = ?',$campo);
         $numero = $q->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);
         //Y asignamos los valores de la orden de trabajo a los campos del presupuesto       
         $presupuesto->setNumero($numero);
         $presupuesto->setObservaciones($this->parte->getObservaciones());
         $presupuesto->setTotal($this->parte->getTotal());
         $presupuesto->setClienteId($this->parte->getClienteId());
         $presupuesto->setPersonalId($this->parte->getPersonalId());
         $presupuesto->setEmpresaId($this->parte->getEmpresaId());
         $presupuesto->setVehiculoId($this->parte->getVehiculoId());
         $presupuesto->setTipo($this->parte->getTipo());
         $presupuesto->setImporte($this->parte->getImporte());
         $presupuesto->setDescuento($this->parte->getDescuento());
         $presupuesto->setBase($this->parte->getBase());
         $presupuesto->setIva($this->parte->getIva());
         //Para la fecha asignamos la fecha actual, no la del parte
         $today = date("Y-m-d");
         $presupuesto->setFecha($today);
         
         $conceptos = new Doctrine_Collection('CrmPresupuestoConcepto');
         $i = 0;
         //Creamos los conceptos            
         foreach ($this->parte->getCrmParteConcepto() as $concepto){
             //Creamos un nuevo concepto
             $concepto_pto = new CrmPresupuestoConcepto();
             //Le pasamos los datos del concepto_parte
             $concepto_pto->setCantidad($concepto->getCantidad());
             $concepto_pto->setConcepto($concepto->getConcepto());
             $concepto_pto->setPrecioUnitario($concepto->getPrecioUnitario());
             $concepto_pto->setDescuento($concepto->getDescuento());
             $concepto_pto->setSubtotal($concepto->getSubtotal());
             $concepto_pto->setIva($concepto->getIva());
             $concepto_pto->setTotal($concepto->getTotal());
             $concepto_pto->setPresupuestoId(1);
             //$concepto_pto->setPresupuesto($presupuesto);
             //Lo guardamos en una lista
             $conceptos[$i] = $concepto_pto;
             $i++;
         }
         //Este set guarda los conceptos en la BD, pero no queremos esto, solo queremos que aparezcan en le formulario
         //$presupuesto->setCrmPresupuestoConcepto($conceptos);
         $this->conceptos = $conceptos;
         
         //Creo una variable para poder marcar más adelante el parte como presupuestado
         $this->getUser()->setAttribute('partePresup',$request->getParameter('id'));
         
        //Y llamo al formulario (como en el método executeEdit) 
  	$this->getUser()->setAttribute('accion','editar');
        //Creo esta variable para poder actualizar el nº de pto cuando se guarde
        $this->getUser()->setAttribute('nuevo_pto',1);        
        //Borro las vbles de sesion de los otros documentos (no sé si es necesario)
        $this->getUser()->getAttributeHolder()->remove('nuevo_parte');
        $this->getUser()->getAttributeHolder()->remove('nueva_fra');
        
        // calculo el resto de los campos y llamo al formulario
        $this->presupuesto = $presupuesto;
        if (null == $this->presupuesto->getDescuento()){
            $this->presupuesto->setDescuento(0);
        }
        $this->cliente = $this->presupuesto->getCrmContacto();
        $this->vehiculo = $this->presupuesto->getCrmVehiculo();
        $this->presupuesto->calcular();
        $this->form = new CrmPresupuestoForm($this->presupuesto);
        $this->setTemplate('edit');   
    }
  }  
  
  public function executeActualizaClienteId(sfWebRequest $request){
     $this->cliente = Doctrine_Core::getTable('CrmContacto')->findOneById($request->getParameter('cliente_id'));
     $this->vehiculo = Doctrine_Core::getTable('CrmVehiculo')->findOneByClienteId($request->getParameter('cliente_id'));
     $this->vehiculos = Doctrine_Core::getTable('CrmVehiculo')->getVehiculoByClienteIdQuery($request->getParameter('cliente_id'))->execute();
     $this->clientes = Doctrine_Core::getTable('CrmContacto')->findAll();
     $cliente = $this->cliente;
     $vehiculo = $this->vehiculo;
     $clientes = $this->clientes;
     $vehiculos = $this->vehiculos;
  }   
  
  public function executeActualizaBusquedaClienteId(sfWebRequest $request){
     $this->cliente = Doctrine_Core::getTable('CrmContacto')->findOneById($request->getParameter('cliente_id'));
     $this->vehiculo = Doctrine_Core::getTable('CrmVehiculo')->findOneByClienteId($request->getParameter('cliente_id'));
     $this->vehiculos = Doctrine_Core::getTable('CrmVehiculo')->getVehiculoByClienteIdQuery($request->getParameter('cliente_id'))->execute();
     $this->clientes = Doctrine_Core::getTable('CrmContacto')->findAll();
     $cliente = $this->cliente;
     $vehiculo = $this->vehiculo;
     $clientes = $this->clientes;
     $vehiculos = $this->vehiculos;
  }   
  
  public function executeActualizaVehiculoId(sfWebRequest $request){
     $this->vehiculo = Doctrine_Core::getTable('CrmVehiculo')->findOneById($request->getParameter('vehiculo_id'));
  }   


  public function executeUpdate(sfWebRequest $request)
  {
    $this->forward404Unless($request->isMethod(sfRequest::POST) || $request->isMethod(sfRequest::PUT));
    $this->forward404Unless($crm_presupuesto = Doctrine_Core::getTable('CrmPresupuesto')->find(array($request->getParameter('id'))), sprintf('Object crm_presupuesto does not exist (%s).', $request->getParameter('id')));
    $crm_presupuesto->calcular();
    $this->form = new CrmPresupuestoForm($crm_presupuesto);
    
    //Borro la vble de sesión que venía de presupuestar parte
    $this->getUser()->getAttributeHolder()->remove('borrarBD');
    
    $this->processForm($request, $this->form);
    
    $this->setTemplate('edit');
  }
  
  public function executeAddConcepto(sfWebRequest $request){
  	$this->forward404unless($request->isXmlHttpRequest());
  	$number = intval($request->getParameter("num"));
        
  	$this->form = new CrmPresupuestoForm();
  	$this->form->addNewFields($number);
  	return $this->renderPartial('addNewConcepto',array('form' => $this->form, 'number' => $number));
  }

  public function executeDelete(sfWebRequest $request)
  {
    $request->checkCSRFProtection();

    $this->forward404Unless($crm_presupuesto = Doctrine_Core::getTable('CrmPresupuesto')->find(array($request->getParameter('id'))), sprintf('Object crm_presupuesto does not exist (%s).', $request->getParameter('id')));
    $crm_presupuesto->delete();
    
    $this->getUser()->setFlash('notice', sfContext::getInstance()->getI18n()->__('The selected item have been deleted successfully.'));
    $this->redirect('presupuesto/index');
  }

  public function executeCancelarBD(sfWebRequest $request){
      
    $request->checkCSRFProtection();

    $this->forward404Unless($crm_presupuesto = Doctrine_Core::getTable('CrmPresupuesto')->find(array($request->getParameter('id'))), sprintf('Object crm_presupuesto does not exist (%s).', $request->getParameter('id')));
    $crm_presupuesto->delete();  
    //Borro la vble de sesión que venía de presupuestar parte
    //Si vengo de presupuestar parte y he cancelado debo borrar el signo presupuestado del parte.
    $id_parte = $this->getUser()->getAttribute('borrarBD');
    if ($id_parte){
        //Y decremento el nº de presupuesto
        $campo = "numPresupuesto";
        $q = Doctrine_Query::create()
               ->select('valor')
               ->from('CrmConfiguracion c1')
               ->where('c1.campo = ?',$campo);
        $numero = $q->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);
        $q = Doctrine_Query::create()
               ->update('CrmConfiguracion cf')
               ->set('cf.valor','?',$numero-1)
               ->where('cf.campo = ?',$campo);
        //Y la lanzo
        $q->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);
        $crm_parte = Doctrine_Core::getTable('CrmParte')->find($id_parte);
        $crm_parte->is_validated = false;
        $crm_parte->save();
        
        $this->getUser()->getAttributeHolder()->remove('borrarBD');
        $this->getUser()->setFlash('error', sfContext::getInstance()->getI18n()->__('Se ha cancelado presupuestar el parte nº'.$id_parte));
        $this->redirect('parte/index');
    }
    else {
        $this->redirect('presupuesto/index');
    }    
    
}
  /*
   * Método creado para facturar un presupuesto, sin embargo al guardar primero en la BD, si la 
   * edición de la factura se cancela, esta ya se ha guardado por lo que deberemos controlar
   * con una vble de sesión si eso ocurre y borrarlo de la Bd en tal caso.
   */
  public function executeFacturar(sfWebRequest $request)
  {
     //Veo si ya está presupuestado, en cuyo caso muestro un mensaje
     $this->presupuesto = Doctrine_Core::getTable('CrmPresupuesto')->find(array($request->getParameter('id')));
    //Requisito: Para Facturar un presupuesto, este debe estar aceptado. Elimino requisito!!! 
     //if ($this->presupuesto->remove_it != TRUE){
       //    $this->getUser()->setFlash('error', sfContext::getInstance()->getI18n()->__('ERROR: El presupuesto nº '.$this->presupuesto->getNumero().' no está aceptado'));
         //  $this->redirect('@crm_presupuesto');
     //}
     //else {
         if ($this->presupuesto->is_validated == TRUE) {
                $this->getUser()->setFlash('error', sfContext::getInstance()->getI18n()->__('ERROR: El presupuesto nº '.$this->presupuesto->getNumero().' ya está facturado'));
                $this->redirect('@crm_presupuesto');
          } 
          else {
                //Si no está facturado
                //Creo un nuevo objeto Factura
                $fra = new CrmFactura();
                //Establecemos el numero de factura que le corresponde
                $campo = "numFactura";
                $q = Doctrine_Query::create()
                        ->select('valor')
                        ->from('CrmConfiguracion c1')
                        ->where('c1.campo = ?',$campo);
                $numero = $q->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);
                //Y asignamos los valores del presupuesto a los campos de la factura     
                $fra->setNumero($numero);
                $fra->setObservaciones($this->presupuesto->getObservaciones());
                $fra->setTotal($this->presupuesto->getTotal());
                $fra->setClienteId($this->presupuesto->getClienteId());
                $fra->setPersonalId($this->presupuesto->getPersonalId());
                $fra->setEmpresaId($this->presupuesto->getEmpresaId());
                $fra->setVehiculoId($this->presupuesto->getVehiculoId());
                $fra->setTipo($this->presupuesto->getTipo());
                $fra->setImporte($this->presupuesto->getImporte());
                $fra->setDescuento($this->presupuesto->getDescuento());
                $fra->setBase($this->presupuesto->getBase());
                $fra->setIva($this->presupuesto->getIva());
                $fra->setKms($this->presupuesto->getKms());
                //Para la fecha asignamos la fecha actual, no la del presupuesto
                $today = date("Y-m-d");
                $fra->setFecha($today);
                
                //Lo guardamos en la base de datos
                $fra->save();  
         
                //Cogemos la lista de conceptos               
                foreach ($this->presupuesto->getCrmPresupuestoConcepto() as $concepto){
                    //Creamos un nuevo concepto
                    $concepto_fra = new CrmFacturaConcepto();
                    //Le pasamos los datos del concepto_presupuesto
                    $concepto_fra->setCantidad($concepto->getCantidad());
                    $concepto_fra->setConcepto($concepto->getConcepto());
                    $concepto_fra->setPrecioUnitario($concepto->getPrecioUnitario());
                    $concepto_fra->setDescuento($concepto->getDescuento());
                    $concepto_fra->setSubtotal($concepto->getSubtotal());
                    $concepto_fra->setIva($concepto->getIva());
                    $concepto_fra->setTotal($concepto->getTotal());
                    //Y ponemos el id de la factura que acabamos de guardar
                    $concepto_fra->setFacturaId($fra->getId());
                    //Lo guardamos en la base de datos
                    $concepto_fra->save();
                } //foreach
         
                //Lo marcamos como facturado y como aceptado
                $this->presupuesto->is_validated = true;
                $this->presupuesto->remove_it = true;
                $this->presupuesto->save();
                //Como todo ha sido correcto, actualizamos el numero de factura
                //Creo la consulta
                $q = Doctrine_Query::create()
                        ->update('CrmConfiguracion cf')
                        ->set('cf.valor','?',$numero+1)
                        ->where('cf.campo = ?',$campo);
                //Y la lanzo
                $q->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);
                //Mostramos un mensaje por pantalla
                $this->getUser()->setFlash('notice', sfContext::getInstance()->getI18n()->__('El presupuesto nº '.$this->presupuesto->getNumero().' se ha facturado (Factura nº '.$numero.')'));

                //Creo una vble que me permita borrar de la base de datos lo insertado, si cancelo la edición de la factura.
                $this->getUser()->setAttribute('borrarBD',$request->getParameter('id'));
                //$this->redirect('@crm_factura');
                $this->redirect('@crm_factura_edit?id='.$fra->getId());
           }//if 2
    //}  //if 1
     
  }
  
 public function facturarGrupo(CrmPresupuesto $presupuesto)
  {
     //Veo si ya está presupuestado, en cuyo caso no hago nada
     //if ($presupuesto->remove_it != TRUE){
           //$this->getUser()->setFlash('error', sfContext::getInstance()->getI18n()->__('ERROR: El presupuesto nº '.$this->presupuesto->getNumero().' no está aceptado'));
           //$this->redirect('@crm_presupuesto');
     //}
     //else {
         if ($presupuesto->is_validated == TRUE) {
              //  $this->getUser()->setFlash('error', sfContext::getInstance()->getI18n()->__('ERROR: El presupuesto nº '.$this->presupuesto->getNumero().' ya está facturado'));
              //  $this->redirect('@crm_presupuesto');
          } 
          else {
                //Si no está facturado
                //Creo un nuevo objeto Factura
                $fra = new CrmFactura();
                //Establecemos el numero de factura que le corresponde
                $campo = "numFactura";
                $q = Doctrine_Query::create()
                        ->select('valor')
                        ->from('CrmConfiguracion c1')
                        ->where('c1.campo = ?',$campo);
                $numero = $q->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);
                //Y asignamos los valores del presupuesto a los campos de la factura     
                $fra->setNumero($numero);
                $fra->setObservaciones($presupuesto->getObservaciones());
                $fra->setTotal($presupuesto->getTotal());
                $fra->setClienteId($presupuesto->getClienteId());
                $fra->setPersonalId($presupuesto->getPersonalId());
                $fra->setEmpresaId($presupuesto->getEmpresaId());
                $fra->setVehiculoId($presupuesto->getVehiculoId());
                $fra->setTipo($presupuesto->getTipo());
                $fra->setImporte($presupuesto->getImporte());
                $fra->setDescuento($presupuesto->getDescuento());
                $fra->setBase($presupuesto->getBase());
                $fra->setIva($presupuesto->getIva());
                $fra->setKms($presupuesto->getKms());
                //Para la fecha asignamos la fecha actual, no la del presupuesto
                $today = date("Y-m-d");
                $fra->setFecha($today);
                
                //Lo guardamos en la base de datos
                $fra->save();  
         
                //Cogemos la lista de conceptos               
                foreach ($presupuesto->getCrmPresupuestoConcepto() as $concepto){
                    //Creamos un nuevo concepto
                    $concepto_fra = new CrmFacturaConcepto();
                    //Le pasamos los datos del concepto_presupuesto
                    $concepto_fra->setCantidad($concepto->getCantidad());
                    $concepto_fra->setConcepto($concepto->getConcepto());
                    $concepto_fra->setPrecioUnitario($concepto->getPrecioUnitario());
                    $concepto_fra->setDescuento($concepto->getDescuento());
                    $concepto_fra->setSubtotal($concepto->getSubtotal());
                    $concepto_fra->setIva($concepto->getIva());
                    $concepto_fra->setTotal($concepto->getTotal());
                    //Y ponemos el id de la factura que acabamos de guardar
                    $concepto_fra->setFacturaId($fra->getId());
                    //Lo guardamos en la base de datos
                    $concepto_fra->save();
                } //foreach
         
                //Lo marcamos como facturado y como aceptado
                $presupuesto->is_validated = true;
                $presupuesto->remove_it = true;
                $presupuesto->save();
                //Como todo ha sido correcto, actualizamos el numero de factura
                //Creo la consulta
                $q = Doctrine_Query::create()
                        ->update('CrmConfiguracion cf')
                        ->set('cf.valor','?',$numero+1)
                        ->where('cf.campo = ?',$campo);
                //Y la lanzo
                $q->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);
          }//if 2
   // }  //if 1
     
  }
  
public function executeBatch(sfWebRequest $request)
  {
    $request->checkCSRFProtection();

	if (!$action = $request->getParameter('batch_action'))
    {
      $this->getUser()->setFlash('error', sfContext::getInstance()->getI18n()->__('You must select an action to execute on the selected items.'));

      $this->redirect('@crm_presupuesto');
    }

    if (!$ids = $request->getParameter('ids'))
    {
	  if ($action == 'batchPrint')  // Le hemos dado a imprimir pero sin seleccionar nada. IMPRIMIR TODO
      {
    		if (!method_exists($this, $method = 'execute'.ucfirst($action)))
    		{
      			throw new InvalidArgumentException(sprintf('You must create a "%s" method for action "%s"', $method, $action));
    		}
    		// execute batch executeBachPrint sin ids
      		$this->$method($request);
      }
      $this->getUser()->setFlash('error',sfContext::getInstance()->getI18n()->__('You must at least select one item.'));

      $this->redirect('@crm_presupuesto');
    }

    if (!method_exists($this, $method = 'execute'.ucfirst($action)))
    {
      throw new InvalidArgumentException(sprintf('You must create a "%s" method for action "%s"', $method, $action));
    }


    $validator = new sfValidatorDoctrineChoice(array('multiple' => true, 'model' => 'CrmPresupuesto'));
    try
    {
      // validate ids
      $ids = $validator->clean($ids);

      // execute batch
      $this->$method($request);
    }
    catch (sfValidatorError $e)
    {
      $this->getUser()->setFlash('error',sfContext::getInstance()->getI18n()->__('A problem occurs when deleting the selected items as some items do not exist anymore.'));
    }

    $this->redirect('@crm_presupuesto');
  }
  
  public function executeImprimir(sfWebRequest $request)
  {
  	// Cargamos el helper para la fecha
  	sfContext::getInstance()->getConfiguration()->loadHelpers('Date');
  	
  	// Recogemos los datos del presupuesto
  	$presupuesto = Doctrine_Core::getTable('CrmPresupuesto')->find(array($request->getParameter('id')));
  	$this->forward404Unless($presupuesto);
        $cliente = Doctrine_Core::getTable('CrmContacto')->find($presupuesto->getClienteId());
        $vehiculo = $presupuesto->getCrmVehiculo();
        $conceptos = $presupuesto->getCrmPresupuestoConcepto();
        $conceptosData = $conceptos->getData();

        // Variables para generar el documento pdf
        //$titulo = sfContext::getInstance()->getI18n()->__('Datos del Vehiculo');
        //Tomo los datos de la empresa de la base de datos.
        $id_empresa = $this->getUser()->getAttribute('empresa_id');
        $empresa = Doctrine_Core::getTable('CrmEmpresa')->find(array($id_empresa));
  
  	//Cargamos los datos del pdf
  	$config = sfTCPDFPluginConfigHandler::loadConfig();
  	// pdf object
  	$pdf = new FONDOPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
  	$saltoEncabezado = PDF_HEADER_STRING;
  	$limite = 230;
  	$numpagina = 1;
  	$separ = 1;

    // Definimos los metadatos
    $pdf->setMetadata();
 
    // set header and footer fonts
    $pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));

    // set default monospaced font
    $pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);

    //set margins
    $pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
    $pdf->SetHeaderMargin(0);
    $pdf->SetFooterMargin(0);

    // remove default footer
    $pdf->setPrintFooter(false);

    //set auto page breaks
    $pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);

    //set image scale factor
    $pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);

    //set some language-dependent strings
    //$pdf->setLanguageArray($l);

    // ---------------------------------------------------------

    // add a page
    $pdf->AddPage();

    // get the current page break margin
    $bMargin = $pdf->getBreakMargin();
    // get current auto-page-break mode
    $auto_page_break = $pdf->getAutoPageBreak();
    // disable auto-page-break
    $pdf->SetAutoPageBreak(false, 0);
    // set bacground image
    $img_file = sfConfig::get('pdf_imagenfondo');
    $pdf->Image($img_file, 0, 0, 210, 297, '', '', '', false, 300, '', false, false, 0);
    // restore auto-page-break status
    $pdf->SetAutoPageBreak($auto_page_break, $bMargin);
    // set the starting point for the page content
    $pdf->setPageMark();
    
    $pdf->escribeDatosEmpresa($empresa);
    $pdf->escribeLogo($empresa);
    $pdf->escribeTextoDocumento();
    $pdf->escribeDocumento('Presupuesto',$presupuesto->getNumero(),$numpagina, format_date($presupuesto->getFecha(), "d"), $cliente, $vehiculo, $presupuesto->getKms());
    
    $conceptos=$pdf->escribeConceptos($conceptos);
     while ($conceptos->count()!=0){
     	$pdf->escribeTotales($presupuesto, false);
     	$numpagina = $numpagina+1;
     	// add a page
    	$pdf->AddPage();
    	// get the current page break margin
    	$bMargin = $pdf->getBreakMargin();
    	// get current auto-page-break mode
    	$auto_page_break = $pdf->getAutoPageBreak();
    	// disable auto-page-break
    	$pdf->SetAutoPageBreak(false, 0);
    	// set bacground image
    	$img_file = sfConfig::get('pdf_imagenfondo');
    	$pdf->Image($img_file, 0, 0, 210, 297, '', '', '', false, 300, '', false, false, 0);
    	// restore auto-page-break status
    	$pdf->SetAutoPageBreak($auto_page_break, $bMargin);
    	// set the starting point for the page content
    	$pdf->setPageMark();
    	$pdf->escribeDatosEmpresa($empresa);
    	$pdf->escribeLogo($empresa);
    	$pdf->escribeTextoDocumento();
    	$pdf->escribeDocumento('Presupuesto',$presupuesto->getNumero(),$numpagina, format_date($presupuesto->getFecha(), "d"), $cliente, $vehiculo, $presupuesto->getKms());
    	$conceptos=$pdf->escribeConceptos($conceptos);
    }   
    $pdf->escribeTotales($presupuesto,true);
  
    //Escribo las observaciones solo en la última página
    $pdf->escribeObservaciones();
    
    // Close and output PDF document
    $pdf->Output('Presupuesto '.$presupuesto->getNumero().'.pdf', 'I');
  	
  	// Stop symfony process
  	throw new sfStopException();  	 
  }

  protected function imprimeDocumento(FONDOPDF $pdf, CrmPresupuesto $presupuesto)
  {
  	// Cargamos el helper para la fecha
  	sfContext::getInstance()->getConfiguration()->loadHelpers('Date');
  	 
  	// Recogemos los datos del presupuesto
  	$cliente = Doctrine_Core::getTable('CrmContacto')->find($presupuesto->getClienteId());
  	$vehiculo = $presupuesto->getCrmVehiculo();
  	$conceptos = $presupuesto->getCrmPresupuestoConcepto();
  	$conceptosData = $conceptos->getData();
  
  	// Variables para generar el documento pdf
  	//$titulo = sfContext::getInstance()->getI18n()->__('Datos del Vehiculo');
          
        //Tomo los datos de la empresa de la base de datos.
        $id_empresa = $this->getUser()->getAttribute('empresa_id');
        $empresa = Doctrine_Core::getTable('CrmEmpresa')->find(array($id_empresa));
  
  	$saltoEncabezado = PDF_HEADER_STRING;
  	$limite = 230;
  	$numpagina = 1;
  	$separ = 1;
  
  	// Definimos los metadatos
  	$pdf->setMetadata();
  
  	// set header and footer fonts
  	$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
  
  	// set default monospaced font
  	$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
  
  	//set margins
  	$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
  	$pdf->SetHeaderMargin(0);
  	$pdf->SetFooterMargin(0);
  
  	// remove default footer
  	$pdf->setPrintFooter(false);
  
  	//set auto page breaks
  	$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
  
  	//set image scale factor
  	$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
  
  	//set some language-dependent strings
  	//$pdf->setLanguageArray($l);
  
  	// ---------------------------------------------------------
  
  	// add a page
  	$pdf->AddPage();
  
  	// get the current page break margin
  	$bMargin = $pdf->getBreakMargin();
  	// get current auto-page-break mode
  	$auto_page_break = $pdf->getAutoPageBreak();
  	// disable auto-page-break
  	$pdf->SetAutoPageBreak(false, 0);
  	// set bacground image
  	$img_file = sfConfig::get('pdf_imagenfondo');
  	$pdf->Image($img_file, 0, 0, 210, 297, '', '', '', false, 300, '', false, false, 0);
  	// restore auto-page-break status
  	$pdf->SetAutoPageBreak($auto_page_break, $bMargin);
  	// set the starting point for the page content
  	$pdf->setPageMark();
  
  	$pdf->escribeDatosEmpresa($empresa);
  	$pdf->escribeLogo($empresa);
  	$pdf->escribeTextoDocumento();
  	$pdf->escribeDocumento('Presupuesto',$presupuesto->getNumero(),$numpagina, format_date($presupuesto->getFecha(), "d"), $cliente, $vehiculo, $presupuesto->getKms());
  
  	$conceptos=$pdf->escribeConceptos($conceptos);
  	while ($conceptos->count()!=0){
  		$pdf->escribeTotales($presupuesto, false);
  		$numpagina = $numpagina+1;
  		// add a page
  		$pdf->AddPage();
  		// get the current page break margin
  		$bMargin = $pdf->getBreakMargin();
  		// get current auto-page-break mode
  		$auto_page_break = $pdf->getAutoPageBreak();
  		// disable auto-page-break
  		$pdf->SetAutoPageBreak(false, 0);
  		// set bacground image
  		$img_file = sfConfig::get('pdf_imagenfondo');
  		$pdf->Image($img_file, 0, 0, 210, 297, '', '', '', false, 300, '', false, false, 0);
  		// restore auto-page-break status
  		$pdf->SetAutoPageBreak($auto_page_break, $bMargin);
  		// set the starting point for the page content
  		$pdf->setPageMark();
  		$pdf->escribeDatosEmpresa($empresa);
  		$pdf->escribeLogo($empresa);
  		$pdf->escribeTextoDocumento();
  		$pdf->escribeDocumento('Presupuesto',$presupuesto->getNumero(),$numpagina, format_date($presupuesto->getFecha(), "d"), $cliente, $vehiculo, $presupuesto->getKms());
  		$conceptos=$pdf->escribeConceptos($conceptos);
  	}
  	$pdf->escribeTotales($presupuesto,true);
        //Escribo las observaciones solo en la última página
        $pdf->escribeObservaciones();
  	
  }
  
  protected function executeBatchPrint(sfWebRequest $request)
  {
  
  	if (!$ids = $request->getParameter('ids')){
  		//imprimir sin ids imprime nada
                $this->getUser()->setFlash('error', sfContext::getInstance()->getI18n()->__('Debe de selecionar al menos uno para imprimir.'));
                /* $records = Doctrine_Query::create()
  		->from('CrmPresupuesto')
  		->execute(); */
  	} else {   // imprime solo los ids selecionados
  		$records = Doctrine_Query::create()
  		->from('CrmPresupuesto')
  		->whereIn('id', $ids)
  		->execute();
  		 
  		//Cargamos los datos del pdf
  		$config = sfTCPDFPluginConfigHandler::loadConfig();
  		// pdf object
  		$pdf = new FONDOPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
  		foreach ($records as $record)
  		{
  			$this->imprimeDocumento($pdf, $record);
  		}
  		// Close and output PDF document
  		$pdf->Output('Lista de Presupuestos.pdf', 'I');
  		 
  		// Stop symfony process
  		throw new sfStopException();
  	}
  
  
  
  	$this->redirect('@crm_presupuesto');
  }
  
   protected function executeBatchFacturar(sfWebRequest $request)
  {
  
  	if (!$ids = $request->getParameter('ids')){
  		//imprimir sin ids imprime nada
                $this->getUser()->setFlash('error', sfContext::getInstance()->getI18n()->__('Debe de selecionar al menos uno para facturar.'));
  		/* $records = Doctrine_Query::create()
  		->from('CrmPresupuesto')
  		->execute(); */
  	} else {   // imprime solo los ids selecionados
  		$records = Doctrine_Query::create()
  		->from('CrmPresupuesto')
  		->whereIn('id', $ids)
  		->execute();
  		 
  		foreach ($records as $record)
  		{
                    $this->facturarGrupo($record);
  		}
      	
                $this->getUser()->setFlash('notice', sfContext::getInstance()->getI18n()->__('Los elementos seleccionados se han facturado'));
                $this->redirect('@crm_presupuesto'); //No tengo muy claro a donde direccionarlo ni el msj a dar (confuso si mezcla erroneos y correctos)
    	}
  
  	$this->redirect('@crm_presupuesto');
  }
  
  protected function executeBatchDelete(sfWebRequest $request)
  {
    $ids = $request->getParameter('ids');

    $records = Doctrine_Query::create()
      ->from('CrmPresupuesto')
      ->whereIn('id', $ids)
      ->execute();

    foreach ($records as $record)
    {
      $record->delete();
    }

    $this->getUser()->setFlash('notice', sfContext::getInstance()->getI18n()->__('The selected items have been deleted successfully.'));
    $this->redirect('@crm_presupuesto');
  }

  protected function processForm(sfWebRequest $request, sfForm $form)
  {
    $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));
    
    if ($form->isValid())
    {
      $crm_presupuesto = $form->save();
      
      //Si vengo de un nuevo presupuesto y todo ha sido correcto, tendré un nuevo número
      //también puedo venir de una edición o bien haber creado el presupuesto de un parte (presupuestarParte)
      if ($this->getUser()->getAttribute('nuevo_pto') == 1){
            //Actualizamos el siguiente numero de presupuesto
            $campo = "numPresupuesto";
            // Creo la consulta
            $q = Doctrine_Query::create()
                ->update('CrmConfiguracion cf')
                ->set('cf.valor','?',$crm_presupuesto->getNumero()+1)
                ->where('cf.campo = ?',$campo);
            //Y la lanzo
            $q->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);
      }      
      
      //Si vengo de un parte y se ha creado el presupuesto, lo marco como presupuestado
      if ($this->getUser()->getAttribute('partePresup')){
            $this->parte = Doctrine_Core::getTable('CrmParte')->find(array($this->getUser()->getAttribute('partePresup')));
            $this->parte->is_validated = TRUE;
            $this->parte->save();
            //Y elimino la vble de sesión
            $this->getUser()->getAttributeHolder()->remove('partePresup');
      }
      
      //Actualizo el valor de kilometros de Vehiculos con los del presupuesto
      $q = Doctrine_Query::create()
                ->update('CrmVehiculo v')
                ->set('v.kms','?',$form->getValue('kms'))
                ->where('v.id = ?',$form->getValue('vehiculo_id'));
      //Y la lanzo
      $q->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);
      
      //$this->redirect('presupuesto/edit?id='.$crm_presupuesto->getId());
      $this->getUser()->setFlash('notice', sfContext::getInstance()->getI18n()->__('El presupuesto ha sido actualizado'));
      $this->redirect('presupuesto/index');
    }
  }

  protected function getFilters()
  {
    return $this->getUser()->getAttribute('presupuesto.filters');
  }

  protected function setFilters(array $filters)
  {
    return $this->getUser()->setAttribute('presupuesto.filters', $filters);
  }

  protected function getPager()
  {
    $campo = "numRegistros";
    $q = Doctrine_Query::create()
    ->select('valor')
    ->from('CrmConfiguracion c1')
    ->where('c1.campo = ?',$campo);
    $numelementos = $q->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);
      
    $pager = new sfDoctrinePager('CrmPresupuesto', $numelementos);  
    //$pager = new sfDoctrinePager('CrmPresupuesto', sfConfig::get('app_list_max_presupuestos'));
    $pager->setQuery($this->buildQuery());
    $pager->setPage($this->getPage());
    $pager->init();

    return $pager;
  }

  protected function setPage($page)
  {
    $this->getUser()->setAttribute('presupuesto.page', $page);
  }

  protected function getPage()
  {
    return $this->getUser()->getAttribute('presupuesto.page', 1);
  }

  protected function buildQuery()
  {
    $tableMethod = 'CrmPresupuesto';
    $filterValues = $this->getFilters();
    $this->valores = $filterValues;
    //create a default query
    $query = Doctrine_Core::getTable('CrmPresupuesto')->createQuery('p');

    if (null === $this->filtro)
    {
      $this->filtro = new CrmPresupuestoFormFilter($filterValues);
    }

    //if the form have been submited
    if($filterValues){
      //bind the values
      $this->filtro->bind($filterValues);
      //if valid, specialise the request using the form
      if($this->filtro->isValid())
         $query = $this->filtro->getQuery();
    }

    $this->addSortQuery($query);

    $event = $this->dispatcher->filter(new sfEvent($this, 'crm.build_query'), $query);
    $query = $event->getReturnValue();

    return $query;
  }

  protected function addSortQuery($query)
  {
    if (array(null, null) == ($sort = $this->getSort()))
    {
      return;
    }

    if (!in_array(strtolower($sort[1]), array('asc', 'desc')))
    {
      $sort[1] = 'asc';
    }

    $query->addOrderBy($sort[0] . ' ' . $sort[1]);
  }

  protected function getSort()
  {
    if (null !== $sort = $this->getUser()->getAttribute('presupuesto.sort'))
    {
      return $sort;
    }

    $this->setSort(array('id',sfConfig::get('app_sort_default','asc')));

    return $this->getUser()->getAttribute('presupuesto.sort');
  }

  protected function setSort(array $sort)
  {
    if (null !== $sort[0] && null === $sort[1])
    {
      $sort[1] = 'asc';
    }

    $this->getUser()->setAttribute('presupuesto.sort', $sort);
  }

  protected function isValidSortColumn($column)
  {
    return Doctrine_Core::getTable('CrmPresupuesto')->hasColumn($column);
  }
  
  protected function esPrimerPresupuesto(){
    $campo = "primerPresupuesto";
    $q = Doctrine_Query::create()
    ->select('valor')
    ->from('CrmConfiguracion c1')
    ->where('c1.campo = ?',$campo);
    $primera = $q->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);
    return $primera;
  }  
   
}